import cv2


from utils.image_preprocess import enhance_image
from utils.multi_text_detector import MultiTextDetector
from utils.ocr_wrapper import OCRWrapper

# detection_optimization.py 或 main.py 中

import cv2
from utils.image_preprocess import enhance_image
from utils.ocr_wrapper import OCRWrapper
import numpy as np

from utils.parallel_ocr import parallel_ocr_recognize

"""
    步骤说明：
    1. 读取图片；
    2. 按不同比例缩放图片（如原图1.0倍、缩小0.5倍）；
    3. 对缩放后的图片做图像增强（enhance_image）；
    4. 用 MultiTextDetector 检测文字框，并过滤掉不符合条件的框；
    5. 对每个文字框裁剪出对应区域，调用 OCRWrapper 识别文字和置信度；
    6，并发地调用 OCRWrapper 识别文字和置信度，并把识别结果（文字、置信度、框坐标和比例）保存到列表中。
    6. 把识别结果（文字、置信度、框坐标和比例）保存到列表中。
    """
def multi_scale_detect(image_path, scales=[1.0, 0.5]):

    detector = MultiTextDetector(lang='ch')
    ocr = OCRWrapper(lang='ch')
    all_results = []

    for scale in scales:
        img = cv2.imread(image_path)
        if img is None:
            raise ValueError(f"无法读取图像: {image_path}")

        if scale != 1.0:
            img = cv2.resize(img, (0, 0), fx=scale, fy=scale)

        enhanced_img = enhance_image(img)

        boxes = detector.detect(enhanced_img)
        filtered_boxes = detector.filter_boxes(boxes)

        print(f"[Scale: {scale}] 检测到文本框数量: {len(filtered_boxes)}")

        # 只取框的坐标列表，传给并发识别
        box_coords = [box['box'] for box in filtered_boxes]

        # 并发识别
        ocr_results = parallel_ocr_recognize(ocr, enhanced_img, box_coords)

        # 把scale信息补充回去
        for res in ocr_results:
            res['scale'] = scale
            all_results.append(res)

    return all_results


#文字置信度来过滤结果，只留下置信度较高的文字
def context_assisted_filter(image, ocr_results):
    """
    利用上下文辅助信息过滤
    """
    filtered_results = []
    for item in ocr_results:
        score = item.get('score', 0)
        text = item.get('text', '')
        if score > 0.5:
            filtered_results.append((text, score))
    return filtered_results

#去掉重复的文字，保证每个文字只出现一次
def deduplicate_results(ocr_results):
    seen_texts = set()
    unique_results = []
    for text, score in ocr_results:
        if text not in seen_texts:
            seen_texts.add(text)
            unique_results.append((text, score))
    return unique_results


